# coding=utf-8
import datetime
from sqlalchemy import *
from sqlalchemy.orm import *
from flask_sqlalchemy import SQLAlchemy
from geoalchemy2 import Geometry, Geography
from conf.constant import *
from sqlalchemy.ext.declarative import AbstractConcreteBase, declarative_base

db = SQLAlchemy()


def now():
    return datetime.datetime.now()


# 字典目录表
class WordCatalog(db.Model):
    __tablename__ = 'sm_word_catalog'

    catalog_id = Column(Integer, primary_key=True)
    # 父id，可空
    parent_id = Column(Integer, comment='父id，可空')
    # 名称
    catalog_name = Column(String(255), default='', comment='名称')
    # 子项信息(这种不是数据库字段，为了方便查询)
    item_info = db.relationship('WordItem', back_populates='catalog_info')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')


# 字典项表
class WordItem(db.Model):
    __tablename__ = 'sm_word_item'

    item_id = Column(Integer, primary_key=True)
    # 字典目录id
    catalog_id = Column(Integer, ForeignKey('sm_word_catalog.catalog_id'), nullable=False, comment='字典目录id')
    # 目录信息
    catalog_info = db.relationship('WordCatalog', back_populates='item_info')
    # 名称
    item_name = Column(String(255), default='', comment='名称')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')


# 数据集
class DataSet(db.Model):
    __tablename__ = 'sm_data_set'

    data_set_id = Column(Integer, primary_key=True)
    # 名称
    data_set_name = Column(String(255), default='', comment='名称')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 数据子集
class SubDataSet(db.Model):
    __tablename__ = 'sm_sub_data_set'

    sub_set_id = Column(Integer, primary_key=True)
    # 数据集id
    data_set_id = Column(Integer, ForeignKey('sm_data_set.data_set_id'), nullable=False, comment='数据集id')
    # 名称
    sub_set_name = Column(String(255), default='', comment='名称')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 扩展信息(用于存放物体系统世界id，空间id等)
    extend_info = Column(JSON)
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 导入文件信息
class ImportFile(db.Model):
    __tablename__ = 'sm_import_file'
    file_id = Column(Integer, primary_key=True)
    # 文件名称
    file_name = Column(String(255), default='', comment='文件名称')
    # 文件路径
    file_path = Column(String(255), default='', comment='文件路径')
    # 备份路径
    backup_path = Column(String(255), default='', comment='备份路径')
    # 导入进度
    import_progress = Column(Float, default=0, comment='导入进度')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 批次
class Batch(db.Model):
    __tablename__ = 'sm_batch'

    batch_id = Column(Integer, primary_key=True)
    # 用户id(创建批次的用户)
    user_id = Column(Integer, nullable=False, comment='用户id(创建批次的用户)')
    # 数据子集id
    sub_set_id = Column(Integer, comment='数据子集id')
    # 地理数据文件
    file_id = Column(Integer, ForeignKey('sm_import_file.file_id'), comment='地理数据文件')
    # 坐标系wkid
    srid = Column(Integer, comment='坐标系wkid')
    # 扩展信息
    extend_info = Column(JSON, comment='扩展信息')
    # 备注信息
    remark = Column(Text, comment='备注信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 任务
class Task(db.Model):
    __tablename__ = 'sm_task'

    task_id = Column(Integer, primary_key=True)
    # 用户id(创建任务的用户)
    user_id = Column(Integer, nullable=False, comment='用户id(创建任务的用户)')
    # 批次id
    batch_id = Column(Integer, comment='批次id')
    # 名称
    task_name = Column(String(255), default='', comment='名称')
    # 任务状态（字典101）
    task_status = Column(Integer, default=TASK_STATUS_NEW, nullable=False, comment='任务状态（字典101）')
    # 扩展信息
    extend_info = Column(JSON, comment='扩展信息')
    # 审核备注
    audit_remark = Column(String(255), default='', comment='审核备注')
    # 同步到物体库结果
    async_status = Column(Integer, default=ASYNC_OBJ_NEW, nullable=False, comment='同步到物体库结果')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 任务状态记录
class TaskTrace(db.Model):
    __tablename__ = 'sm_task_trace'

    trace_id = Column(Integer, primary_key=True)
    # 任务id
    task_id = Column(Integer, ForeignKey('sm_task.task_id'), nullable=False, comment='任务id')
    # 任务状态（字典101）
    task_status = Column(Integer, nullable=False, comment='任务状态（字典101）')
    # 操作人id
    operator_id = Column(Integer, comment='操作人id')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 任务-数据 关联关系表
class TaskDataRelation(db.Model):
    __tablename__ = 'sm_task_data_relation'

    relation_id = Column(Integer, primary_key=True)
    # 任务id
    task_id = Column(Integer, ForeignKey('sm_task.task_id'), comment='任务id')
    # 数据id(temporary_data表的data_id)
    data_id = Column(Integer, ForeignKey('gs_temporary_data.data_id'), comment='数据id(temporary_data表的data_id)')
    # 审核状态(字典106)
    audit_status = Column(Integer, default=AUDIT_STATUS_NEW, comment='审核状态(字典106)')
    # 审核备注
    audit_remark = Column(String(255), default='', comment='审核备注')
    # 同步到物体库结果
    async_status = Column(Integer, default=ASYNC_OBJ_NEW, nullable=False, comment='同步到物体库结果')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 用户表
class User(db.Model):
    __tablename__ = 'sm_user'

    user_id = Column(Integer, primary_key=True)
    # 用户名(一般是手机)
    username = Column(String(40), nullable=False, index=True, comment='用户名(一般是手机)')
    # 密码，MD5后的值
    password = Column(String(255), default='', comment='密码，MD5后的值')
    # token(用户登陆成功后令牌)
    token = Column(String(255), default='', comment='token(用户登陆成功后令牌)')
    # 姓名
    nick_name = Column(String(255), index=True, comment='姓名')
    # 邮箱
    email = Column(String(80), default='', index=True, comment='邮箱')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 导出记录
class ExportRecord(db.Model):
    __tablename__ = 'sm_export_record'

    record_id = Column(Integer, primary_key=True)
    # 操作人id
    user_id = Column(Integer, comment='操作人id')
    # 子集id
    sub_set_id = Column(Integer, ForeignKey('sm_sub_data_set.sub_set_id'), nullable=False, comment='子集id')
    # 导出的层
    geo_layers = Column(ARRAY(Integer), nullable=False, comment='导出的层')
    # 文件位置(含文件名)
    file_path = Column(String(255), default='', comment='文件位置(含文件名)')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 导出进度
    export_progress = Column(Float, default=0, comment='导出进度')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 临时表
class TemporaryData(db.Model):
    __tablename__ = 'gs_temporary_data'

    data_id = Column(Integer, primary_key=True)
    # 批次id
    batch_id = Column(Integer, comment='批次id')
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 层
    geo_layer = Column(Integer, comment='层')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 高度
    height = Column(String(255), default='', comment='高度')
    # 编码
    code = Column(String(255), default='', comment='编码')
    # 名称
    name = Column(String(255), default='', comment='名称')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 模型长度
    shape_length = Column(Float, default=0, comment='模型长度')
    # 模型区域
    shape_area = Column(Float, default=0, comment='模型区域')
    # 地理数据类型(见常量表 GEO数据类型)
    geo_type = Column(String(40), default=GEO_TYPE_GEOMETRY, comment='地理数据类型(见常量表 GEO数据类型)')
    # 地理信息
    geom = Column(Geometry(srid=3857, dimension=3, management=True), comment='地理信息')
    # 检测状态（字典103）
    check_status = Column(Integer, default=CHECK_STATUS_NORMAL, nullable=False, comment='检测状态（字典103）')
    # 检测备注（填写检测异常时的信息）
    check_remark = Column(String(255), comment='检测备注（填写检测异常时的信息）')
    # 是否已经修改(此字段由触发器修改)
    is_modify = Column(Boolean, default=True, comment='是否已经修改(此字段由触发器修改)')
    # 原始数据信息（厂商给过来的数据,用于存放原始id，原始geom等）
    origin_info = Column(JSON, comment='原始数据信息（厂商给过来的数据,用于存放原始id，原始geom等）')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')




# 道路桥梁
class Bridge(db.Model):
    __tablename__ = 'gs_bridge'

    bridge_id = Column(Integer, primary_key=True)
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 数据原始id（厂商给过来时数据的id）
    origin_id = Column(String(255), default='', index=True, comment='数据原始id（厂商给过来时数据的id）')
    # 层，不要改默认值
    geo_layer = Column(Integer, default=GEO_LAYER_BRIDGE, comment='层，不要改默认值')
    # 道路编码
    road_code = Column(String(255), default='', comment='道路编码')
    # 桥梁编码
    bridge_code = Column(String(255), default='', comment='桥梁编码')
    # 桥梁名称
    bridge_name = Column(String(255), default='', comment='桥梁名称')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 模型长度
    shape_length = Column(Float, default=0, comment='模型长度')
    # 模型区域
    shape_area = Column(Float, default=0, comment='模型区域')
    # 地理信息
    geom = Column(Geometry(geometry_type='MULTIPOLYGON', srid=3857, dimension=3, management=True), comment='地理信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 建筑物
class Building(db.Model):
    __tablename__ = 'gs_building'

    building_id = Column(Integer, primary_key=True)
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 数据原始id（厂商给过来时数据的id）
    origin_id = Column(String(255), default='', index=True, comment='数据原始id（厂商给过来时数据的id）')
    # 层，不要改默认值
    geo_layer = Column(Integer, default=GEO_LAYER_BUILDING, comment='层，不要改默认值')
    # 名称
    building_name = Column(String(255), default='', comment='名称')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 高度
    height = Column(String(6), default='', comment='高度')
    # 楼层
    floor = Column(Integer, comment='楼层')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 模型长度
    shape_length = Column(Float, default=0, comment='模型长度')
    # 模型区域
    shape_area = Column(Float, default=0, comment='模型区域')
    # 地理信息
    geom = Column(Geometry(geometry_type='MULTIPOLYGON', srid=3857, dimension=3, management=True), comment='地理信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 涵洞
class Culvert(db.Model):
    __tablename__ = 'gs_culvert'

    culvert_id = Column(Integer, primary_key=True)
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 数据原始id（厂商给过来时数据的id）
    origin_id = Column(String(255), default='', index=True, comment='数据原始id（厂商给过来时数据的id）')
    # 层，不要改默认值
    geo_layer = Column(Integer, default=GEO_LAYER_CULVERT, comment='层，不要改默认值')
    # 道路编码
    road_code = Column(String(255), default='', comment='道路编码')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 模型长度
    shape_length = Column(Float, default=0, comment='模型长度')
    # 模型区域
    shape_area = Column(Float, default=0, comment='模型区域')
    # 地理信息
    geom = Column(Geometry(geometry_type='MULTIPOLYGON', srid=3857, dimension=3, management=True), comment='地理信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 减速带
class Deceleration(db.Model):
    __tablename__ = 'gs_deceleration'

    deceleration_id = Column(Integer, primary_key=True)
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 数据原始id（厂商给过来时数据的id）
    origin_id = Column(String(255), default='', index=True, comment='数据原始id（厂商给过来时数据的id）')
    # 层，不要改默认值
    geo_layer = Column(Integer, default=GEO_LAYER_DECELERATION, comment='层，不要改默认值')
    # 道路编码
    road_code = Column(String(255), default='', comment='道路编码')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 模型长度
    shape_length = Column(Float, default=0, comment='模型长度')
    # 模型区域
    shape_area = Column(Float, default=0, comment='模型区域')
    # 地理信息
    geom = Column(Geometry(geometry_type='MULTIPOLYGON', srid=3857, dimension=3, management=True), comment='地理信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 道路标线
class Delineater(db.Model):
    __tablename__ = 'gs_delineater'

    delineater_id = Column(Integer, primary_key=True)
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 数据原始id（厂商给过来时数据的id）
    origin_id = Column(String(255), default='', index=True, comment='数据原始id（厂商给过来时数据的id）')
    # 层，不要改默认值
    geo_layer = Column(Integer, default=GEO_LAYER_DELINEATER, comment='层，不要改默认值')
    # 道路编码
    road_code = Column(String(255), default='', comment='道路编码')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 模型长度
    shape_length = Column(Float, default=0, comment='模型长度')
    # 地理信息
    geom = Column(Geometry(geometry_type='MULTILINESTRING', srid=3857, dimension=3, management=True), comment='地理信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 隔离栏
class GuardBar(db.Model):
    __tablename__ = 'gs_guardbar'

    guardbar_id = Column(Integer, primary_key=True)
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 数据原始id（厂商给过来时数据的id）
    origin_id = Column(String(255), default='', index=True, comment='数据原始id（厂商给过来时数据的id）')
    # 层，不要改默认值
    geo_layer = Column(Integer, default=GEO_LAYER_GUARDBAR, comment='层，不要改默认值')
    # 道路编码
    road_code = Column(String(255), default='', comment='道路编码')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 模型长度
    shape_length = Column(Float, default=0, comment='模型长度')
    # 地理信息
    geom = Column(Geometry(geometry_type='MULTILINESTRING', srid=3857, dimension=3, management=True), comment='地理信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 照明设施
class Illumination(db.Model):
    __tablename__ = 'gs_illumination'

    illumination_id = Column(Integer, primary_key=True)
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 数据原始id（厂商给过来时数据的id）
    origin_id = Column(String(255), default='', index=True, comment='数据原始id（厂商给过来时数据的id）')
    # 层，不要改默认值
    geo_layer = Column(Integer, default=GEO_LAYER_ILLUMINATION, comment='层，不要改默认值')
    # 道路编码
    road_code = Column(String(255), default='', comment='道路编码')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 地理信息
    geom = Column(Geometry(geometry_type='POINT', srid=3857, dimension=3, management=True), comment='地理信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 土地用途
class LandUse(db.Model):
    __tablename__ = 'gs_landuse'

    landuse_id = Column(Integer, primary_key=True)
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 数据原始id（厂商给过来时数据的id）
    origin_id = Column(String(255), default='', index=True, comment='数据原始id（厂商给过来时数据的id）')
    # 层，不要改默认值
    geo_layer = Column(Integer, default=GEO_LAYER_LANDUSE, comment='层，不要改默认值')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 模型长度
    shape_length = Column(Float, default=0, comment='模型长度')
    # 模型区域
    shape_area = Column(Float, default=0, comment='模型区域')
    # 地理信息
    geom = Column(Geometry(geometry_type='MULTIPOLYGON', srid=3857, dimension=3, management=True), comment='地理信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 道路中心线
class RoadLine(db.Model):
    __tablename__ = 'gs_roadline'

    roadline_id = Column(Integer, primary_key=True)
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 数据原始id（厂商给过来时数据的id）
    origin_id = Column(String(255), default='', index=True, comment='数据原始id（厂商给过来时数据的id）')
    # 层，不要改默认值
    geo_layer = Column(Integer, default=GEO_LAYER_ROADLINE, comment='层，不要改默认值')
    # 道路编码
    road_code = Column(String(255), default='', comment='道路编码')
    # 名称
    road_name = Column(String(255), default='', comment='名称')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 中心线编码
    line_code = Column(String(255), default='', comment='中心线编码')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 模型长度
    shape_length = Column(Float, default=0, comment='模型长度')
    # 地理信息
    geom = Column(Geometry(geometry_type='MULTILINESTRING', srid=3857, dimension=3, management=True), comment='地理信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 道路面
class RoadPolygon(db.Model):
    __tablename__ = 'gs_roadpolygon'

    roadpolygon_id = Column(Integer, primary_key=True)
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 数据原始id（厂商给过来时数据的id）
    origin_id = Column(String(255), default='', index=True, comment='数据原始id（厂商给过来时数据的id）')
    # 层，不要改默认值
    geo_layer = Column(Integer, default=GEO_LAYER_ROADPOLYGON, comment='层，不要改默认值')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 模型长度
    shape_length = Column(Float, default=0, comment='模型长度')
    # 模型区域
    shape_area = Column(Float, default=0, comment='模型区域')
    # 地理信息
    geom = Column(Geometry(geometry_type='MULTIPOLYGON', srid=3857, dimension=3, management=True), comment='地理信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 道路标志
class RoadSign(db.Model):
    __tablename__ = 'gs_roadsign'

    roadsign_id = Column(Integer, primary_key=True)
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 数据原始id（厂商给过来时数据的id）
    origin_id = Column(String(255), default='', index=True, comment='数据原始id（厂商给过来时数据的id）')
    # 层，不要改默认值
    geo_layer = Column(Integer, default=GEO_LAYER_ROADSIGN, comment='层，不要改默认值')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 地理信息
    geom = Column(Geometry(geometry_type='POINT', srid=3857, dimension=3, management=True), comment='地理信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 道路绿化
class TreeLawn(db.Model):
    __tablename__ = 'gs_treelawn'

    treelawn_id = Column(Integer, primary_key=True)
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 数据原始id（厂商给过来时数据的id）
    origin_id = Column(String(255), default='', index=True, comment='数据原始id（厂商给过来时数据的id）')
    # 层，不要改默认值
    geo_layer = Column(Integer, default=GEO_LAYER_TREELAWN, comment='层，不要改默认值')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 模型长度
    shape_length = Column(Float, default=0, comment='模型长度')
    # 模型区域
    shape_area = Column(Float, default=0, comment='模型区域')
    giscol = Column(String(2), default='')
    # 地理信息
    geom = Column(Geometry(geometry_type='MULTIPOLYGON', srid=3857, dimension=3, management=True), comment='地理信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 隧道
class Tunnel(db.Model):
    __tablename__ = 'gs_tunnel'

    tunnel_id = Column(Integer, primary_key=True)
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 数据原始id（厂商给过来时数据的id）
    origin_id = Column(String(255), default='', index=True, comment='数据原始id（厂商给过来时数据的id）')
    # 层，不要改默认值
    geo_layer = Column(Integer, default=GEO_LAYER_TUNNEL, comment='层，不要改默认值')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 道路编码
    road_code = Column(String(255), default='', comment='道路编码')
    # 隧道编码
    tunnel_code = Column(String(255), default='', comment='隧道编码')
    # 名称
    tunnel_name = Column(String(255), default='', comment='名称')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 模型长度
    shape_length = Column(Float, default=0, comment='模型长度')
    # 模型区域
    shape_area = Column(Float, default=0, comment='模型区域')
    # 地理信息
    geom = Column(Geometry(geometry_type='MULTIPOLYGON', dimension=3, srid=3857), comment='地理信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 水域
class Water(db.Model):
    __tablename__ = 'gs_water'

    water_id = Column(Integer, primary_key=True)
    # 数据子集id
    sub_set_id = Column(Integer, nullable=False, comment='数据子集id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据在物体系统的id（如果未有物体，这个是空的）
    global_id = Column(String(255), default='', index=True, comment='数据在物体系统的id（如果未有物体，这个是空的）')
    # 数据来源名称（如四维图新）
    source_name = Column(String(255), default='', index=True, comment='数据来源名称（如四维图新）')
    # 数据原始id（厂商给过来时数据的id）
    origin_id = Column(String(255), default='', index=True, comment='数据原始id（厂商给过来时数据的id）')
    # 层，不要改默认值
    geo_layer = Column(Integer, default=GEO_LAYER_WATER, comment='层，不要改默认值')
    # 类型
    gis_class = Column(String(20), default='', comment='类型')
    # 水域编码
    water_code = Column(String(255), default='', comment='水域编码')
    # 名称
    water_name = Column(String(255), default='', comment='名称')
    # 失效时间
    in_date = Column(TIMESTAMP(6), comment='失效时间')
    # 有效时间
    va_date = Column(TIMESTAMP(6), comment='有效时间')
    # 备注
    remark = Column(String(255), default='', comment='备注')
    # 模型长度
    shape_length = Column(Float, default=0, comment='模型长度')
    # 模型区域
    shape_area = Column(Float, default=0, comment='模型区域')
    # 地理信息
    geom = Column(Geometry(geometry_type='MULTIPOLYGON', srid=3857, dimension=3, management=True), comment='地理信息')
    # 逻辑删除
    is_deleted = Column(Boolean, default=False, comment='逻辑删除')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')


# 数据修改记录表(编辑库)
class DataTrace(db.Model):
    __tablename__ = 'sm_data_trace'

    # 记录id
    trace_id = Column(Integer,  primary_key=True, comment='记录id')
    # 数据id
    data_id = Column(Integer, nullable=False, comment='数据id')
    # 数据在GIS系统的id
    gis_id = Column(String(255), default='', index=True, comment='数据在GIS系统的id')
    # 数据库层(常量【GEO层】)
    geo_layer = Column(Integer, comment='数据库层(常量【GEO层】)')
    # 是否已同步到私有世界
    sync_private = Column(Boolean, default=False, comment='是否已同步到私有世界')
    # 是否已同步到公有世界
    sync_public = Column(Boolean, default=False, comment='是否已同步到公有世界')
    # 审核是否已阅(编辑为审核通过或者驳回)
    is_checked = Column(Boolean, default=False, comment='审核是否已阅(编辑为审核通过或者驳回)')
    # 是否新数据
    is_new = Column(Boolean, default=False, comment='是否新数据')
    # 是否删除数据
    delete_data = Column(Boolean, default=False, comment='是否删除数据')
    # 修改前信息
    pre_geom = Column(Geometry(srid=3857, dimension=3, management=True), comment='修改前信息')
    # 更新时间
    update_time = Column(DateTime, default=now, onupdate=now, comment='更新时间')
    # 创建时间
    create_time = Column(DateTime, default=now, comment='创建时间')

